﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using DAL.EstRec;
using System.Collections;

namespace BAL.EstRec
{
    public class Recurso
    {
        private string _idRecurso;
        private string _recurso;
        private string _idIniciativa;
        private string _iniciativa;
        private string _costo;
        private int _tiempoImplementacion;
        private int _visitasSugeridas;
        private string _tipoRecurso;
        private bool _excReglaIniciativa;
        private bool _excReglaMaxRecursos;
        private string _pathPublicacion;
        private string _guidelines;



        #region Properties
        public string idRecurso
        {
            get { return _idRecurso; }
            set { this._idRecurso = value; }
        }

        public string recurso
        {
            get { return _recurso; }
            set { this._recurso = value; }
        }

        public string idIniciativa
        {
            get { return _idIniciativa; }
            set { this._idIniciativa = value; }
        }

        public string iniciativa
        {
            get { return _iniciativa; }
            set { this._iniciativa = value; }
        }

        public string costo
        {
            get { return _costo; }
            set { this._costo = value; }
        }

        public int tiempoImplementacion
        {
            get { return _tiempoImplementacion; }
            set { this._tiempoImplementacion = value; }
        }

        public int visitasSugeridas
        {
            get { return _visitasSugeridas; }
            set { this._visitasSugeridas = value; }
        }

        public string tipoRecurso
        {
            get { return _tipoRecurso; }
            set { this._tipoRecurso = value; }
        }

        public bool excReglaIniciativa
        {
            get { return _excReglaIniciativa; }
            set { this._excReglaIniciativa = value; }
        }

        public bool excReglaMaxRecursos
        {
            get { return _excReglaMaxRecursos; }
            set { this._excReglaMaxRecursos = value; }
        }

        public string pathPublicacion
        {
            get { return _pathPublicacion; }
            set { _pathPublicacion = value; }
        }

        public string guidelines
        {
            get { return _guidelines; }
            set { _guidelines = value; }
        }

        #endregion Properties

        #region Constructors
        public Recurso() { }
        public Recurso(string idRecurso, string recurso)
        {
            this.idRecurso = idRecurso;
            this.recurso = recurso;
        }

        public Recurso(string recurso)
        {
            this.recurso = recurso;
        }

        public Recurso(string idRecurso, string recurso,string idiniciativa, string iniciativa,string costo
            ,int tiempoimplementacion, int visitassugeridas, string tiporecurso, bool execRIniciativa, bool exeRMaxRecursos)
        {
            this.idRecurso = idRecurso;
            this.recurso = recurso;

            this.idIniciativa = idiniciativa;
            this.iniciativa = iniciativa;
            this.costo = costo;
            this.tiempoImplementacion = tiempoimplementacion;
            this.visitasSugeridas = visitassugeridas;
            this.tipoRecurso = tiporecurso;
            this.excReglaIniciativa = execRIniciativa;
            this.excReglaMaxRecursos = exeRMaxRecursos;
        }

        public Recurso(string idRecurso, string recurso,string idiniciativa, string iniciativa,string costo
            ,int tiempoimplementacion, int visitassugeridas, string tiporecurso, bool execRIniciativa, bool exeRMaxRecursos, string publishPath, string guidelines)
        {
            this.idRecurso = idRecurso;
            this.recurso = recurso;

            this.idIniciativa = idiniciativa;
            this.iniciativa = iniciativa;
            this.costo = costo;
            this.tiempoImplementacion = tiempoimplementacion;
            this.visitasSugeridas = visitassugeridas;
            this.tipoRecurso = tiporecurso;
            this.excReglaIniciativa = execRIniciativa;
            this.excReglaMaxRecursos = exeRMaxRecursos;
            this.pathPublicacion = publishPath;
            this.guidelines = guidelines;
        }

        #endregion Constructors

        public static List<Recurso> GetComboRecurso()
        {
            List<Recurso> listRecurso;

            DataTable dt;

            string sqlStmt;

            //Cadena que ejeucta sp
            sqlStmt = "exec SP_ER_v050_GET_RECURSO";
            try
            {
                dt = SrvDB.ExecuteQuery(sqlStmt);
                //Invertidos
                listRecurso = dt.AsEnumerable().Select(
                            row => new Recurso
                            {
                                idRecurso = String.IsNullOrEmpty(row.Field<string>("RECURSO")) ? "" : row.Field<string>("RECURSO")
                                ,
                                recurso = String.IsNullOrEmpty(row.Field<string>("ID_RECURSO")) ? "" : row.Field<string>("ID_RECURSO")
                            }
                        ).ToList();
                return listRecurso;
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return null;

        }

        public static List<Recurso> GetComboRecurso2(string CurrentP)
        {
            List<Recurso> listRecurso;

            DataTable dt;

            string sqlStmt;

            //Cadena que ejeucta sp
            sqlStmt = "exec SP_ER_v050_GET_RECURSO_FDV @TERRITORIOO = '" + CurrentP + "'";
            try
            {
                dt = SrvDB.ExecuteQuery(sqlStmt);

                listRecurso = dt.AsEnumerable().Select(
                            row => new Recurso
                            {
                                idRecurso = String.IsNullOrEmpty(row.Field<string>("RECURSO")) ? "" : row.Field<string>("RECURSO")
                                ,
                                recurso = String.IsNullOrEmpty(row.Field<string>("ID_RECURSO")) ? "" : row.Field<string>("ID_RECURSO")
                            }
                        ).ToList();
                return listRecurso;
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return null;

        }

        public static bool isRecursoOnCatalog(string _recurso)
        {
            //(new Recurso("r2")).isPosOnCatalog();
            DataTable dt;

            bool res = false;

            string sqlStmt;
            //Cadena que ejeucta sp
            sqlStmt = "exec SP_ER_v050_VALIDAR_RECURSO "
                                + "@recuso='@@par1';";
            sqlStmt = sqlStmt.Replace("@@par1", _recurso.ToString());

            try
            {
                dt = SrvDB.ExecuteQuery(sqlStmt);
                if (dt.Rows.Count == 1)
                {
                    if (Convert.ToBoolean(dt.Rows[0]["BANDERA"]) == true)
                    {
                        res = true;
                    }
                    else
                    {
                        res = false;
                    }
                }

            }
            catch (Exception ex)
            {

                throw ex;
            }

            return res;
        }

        //------------
        public static bool operator ==(Recurso x, Recurso y)
        {
            // If reference same object including null then return true
            if (object.ReferenceEquals(x, y))
            {
                return true;
            }

            // If one object null the return false
            if (object.ReferenceEquals(x, null) || object.ReferenceEquals(y, null))
            {
                return false;
            }

            // Compare object property values
            return VersionsEqual(x, y);
        }

        public static bool operator !=(Recurso x, Recurso y)
        {
            return !(x == y);
        }

        public override bool Equals(object obj)
        {
            // If comparing to null return false
            if (object.ReferenceEquals(obj, null))
            {
                return false;
            }

            // Cast and compare object property values
            Recurso version = obj as Recurso;
            if (version != null)
                return VersionsEqual(this, version);
            else
                return false;
        }

        public override int GetHashCode()
        {
            int iniciativaHash = this.idIniciativa == null ? 0 : this.idIniciativa.GetHashCode();
            int idRecursoHash = this.idRecurso == null ? 0 : this.idRecurso.GetHashCode();

            return iniciativaHash ^ idRecursoHash;
        }

        private static bool VersionsEqual(Recurso x, Recurso y)
        {
            // Compare properties for equality
            return (x.idIniciativa == y.idIniciativa && x.idRecurso == y.idRecurso);
        }

        public static List<Recurso> GetRecursosList()
        {
            List<Recurso> listRecurso;
            DataTable dt;
            string sqlStmt;

            //Cadena que ejeucta sp
            sqlStmt = "exec SP_ER_v050_GET_RECURSO";

            try
            {
                dt = SrvDB.ExecuteQuery(sqlStmt);
                //Invertidos
                listRecurso = dt.AsEnumerable().Select(
                            row => new Recurso
                            {
                                idRecurso = String.IsNullOrEmpty(row.Field<string>("ID_RECURSO")) ? "" : row.Field<string>("ID_RECURSO")
                                ,
                                recurso = String.IsNullOrEmpty(row.Field<string>("RECURSO")) ? "" : row.Field<string>("RECURSO")
                                ,
                                idIniciativa = String.IsNullOrEmpty(row.Field<string>("ID_INICIATIVA")) ? "" : row.Field<string>("ID_INICIATIVA")
                                ,
                                iniciativa = String.IsNullOrEmpty(row.Field<string>("INICIATIVA")) ? "" : row.Field<string>("INICIATIVA")
                                ,
                                costo = String.IsNullOrEmpty(row.Field<string>("COSTO")) ? "" : row.Field<string>("COSTO")
                                ,
                                tiempoImplementacion =row.IsNull("TIEMPO_IMPLEMENTACION")?0: row.Field<int?>("TIEMPO_IMPLEMENTACION").GetValueOrDefault()
                                ,
                                visitasSugeridas = row.IsNull("VISITAS_SUGERIDAS") ? 0 : row.Field<int?>("VISITAS_SUGERIDAS").GetValueOrDefault()
                                ,
                                tipoRecurso = String.IsNullOrEmpty(row.Field<string>("TIPO_RECURSO")) ? "" : row.Field<string>("TIPO_RECURSO")
                                ,
                                excReglaIniciativa = row.IsNull("EXCLUIR_REGLA_INICIATIVA")?false: row.Field<bool?>("EXCLUIR_REGLA_INICIATIVA").GetValueOrDefault()
                                ,
                                excReglaMaxRecursos = row.IsNull("EXCLUIR_REGLA_MAX_RECURSOS")?false: row.Field<bool?>("EXCLUIR_REGLA_MAX_RECURSOS").GetValueOrDefault()
                                ,
                                pathPublicacion = String.IsNullOrEmpty(row.Field<string>("PATH_PUBLICACION")) ? "" : row.Field<string>("PATH_PUBLICACION")
                                ,
                                guidelines = String.IsNullOrEmpty(row.Field<string>("GUIDELINES")) ? "" : row.Field<string>("GUIDELINES")
                            }
                        ).ToList();
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return listRecurso;
        }//

        public static List<Recurso> GetRecursosListSortedIniciativa()
        {
            List<Recurso> listRecurso;
            DataTable dt;
            string sqlStmt;

            //Cadena que ejeucta sp
            sqlStmt = "exec SP_GET_RECURSO_SORTED_IDINC_IDREC";

            try
            {
                dt = SrvDB.ExecuteQuery(sqlStmt);
                //Invertidos
                listRecurso = dt.AsEnumerable().Select(
                            row => new Recurso
                            {
                                idRecurso = String.IsNullOrEmpty(row.Field<string>("ID_RECURSO")) ? "" : row.Field<string>("ID_RECURSO")
                                ,
                                recurso = String.IsNullOrEmpty(row.Field<string>("RECURSO")) ? "" : row.Field<string>("RECURSO")
                                ,
                                idIniciativa = String.IsNullOrEmpty(row.Field<string>("ID_INICIATIVA")) ? "" : row.Field<string>("ID_INICIATIVA")
                                ,
                                iniciativa = String.IsNullOrEmpty(row.Field<string>("INICIATIVA")) ? "" : row.Field<string>("INICIATIVA")
                                ,
                                costo = String.IsNullOrEmpty(row.Field<string>("COSTO")) ? "" : row.Field<string>("COSTO")
                                ,
                                tiempoImplementacion = row.IsNull("TIEMPO_IMPLEMENTACION") ? 0 : row.Field<int?>("TIEMPO_IMPLEMENTACION").GetValueOrDefault()
                                ,
                                visitasSugeridas = row.IsNull("VISITAS_SUGERIDAS") ? 0 : row.Field<int?>("VISITAS_SUGERIDAS").GetValueOrDefault()
                                ,
                                tipoRecurso = String.IsNullOrEmpty(row.Field<string>("TIPO_RECURSO")) ? "" : row.Field<string>("TIPO_RECURSO")
                                ,
                                excReglaIniciativa = row.IsNull("EXCLUIR_REGLA_INICIATIVA") ? false : row.Field<bool?>("EXCLUIR_REGLA_INICIATIVA").GetValueOrDefault()
                                ,
                                excReglaMaxRecursos = row.IsNull("EXCLUIR_REGLA_MAX_RECURSOS") ? false : row.Field<bool?>("EXCLUIR_REGLA_MAX_RECURSOS").GetValueOrDefault()
                                ,
                                pathPublicacion = String.IsNullOrEmpty(row.Field<string>("PATH_PUBLICACION")) ? "" : row.Field<string>("PATH_PUBLICACION")
                                ,
                                guidelines = String.IsNullOrEmpty(row.Field<string>("GUIDELINES")) ? "" : row.Field<string>("GUIDELINES")
                            }
                        ).ToList();
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return listRecurso;
        }//

        public static List<string> GetRecursoIdxVersion(long version)
        {
            List<string> list = new List<string>();
            DataTable dt;
            string sqlStmt;

            //Cadena que ejeucta sp
            sqlStmt = "exec SP_ER_GET_RECURSOxVERSION @VERSION= @@Version";
            sqlStmt = sqlStmt.Replace("@@Version",version.ToString());

            try
            {
                dt = SrvDB.ExecuteQuery(sqlStmt);

                list= dt.AsEnumerable().Select(
                            row => row["ID_RECURSO"].ToString()
                            ).ToList();
            }catch(Exception ex)
            {
                throw ex;
            }

            return list;
        }//

        public static Recurso GetRecursoData(string id_recurso)
        {
            DataTable dt = new DataTable();
            Recurso r = new Recurso() ;
            string query = "SP_ER_GET_RECURSO @IDRECURSO = @@id_recurso ";
            query = query.Replace("@@id_recurso", id_recurso);

            try
            {
                dt = SrvDB.ExecuteQuery(query);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            if (dt.Rows.Count >0)
            {
                r = new Recurso(dt.Rows[0]["ID_RECURSO"].ToString(), dt.Rows[0]["RECURSO"].ToString(), dt.Rows[0]["ID_INICIATIVA"].ToString()
                , dt.Rows[0]["INICIATIVA"].ToString(), dt.Rows[0]["COSTO"].ToString(), int.Parse(dt.Rows[0]["TIEMPO_IMPLEMENTACION"].ToString())
                , int.Parse(dt.Rows[0]["VISITAS_SUGERIDAS"].ToString()), dt.Rows[0]["TIPO_RECURSO"].ToString(), bool.Parse(dt.Rows[0]["EXCLUIR_REGLA_INICIATIVA"].ToString())
                , bool.Parse(dt.Rows[0]["EXCLUIR_REGLA_MAX_RECURSOS"].ToString()), dt.Rows[0]["PATH_PUBLICACION"].ToString(), dt.Rows[0]["GUIDELINES"].ToString());
            }

            return r;

        }//

        public static List<string> GetRecursostoPublish(long version)
        {
            List<string> list = new List<string>();
            DataTable dt;
            string sqlStmt;

            //Cadena que ejeucta sp
            sqlStmt = "exec SP_ER_SELECT_RECURSOStoPUBLISH @UNID_VERSION= @@Version";
            sqlStmt = sqlStmt.Replace("@@Version", version.ToString());

            try
            {
                dt = SrvDB.ExecuteQuery(sqlStmt);

                list = dt.AsEnumerable().Select(
                            row => row["ID_RECURSO"].ToString()
                            ).ToList();
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return list;
        }//

    }
}
